<?php
/**
 * Created by PhpStorm.
 * User: yangos
 * Date: 18-6-19
 * Time: 上午3:32
 */

namespace vola;

/**
 * 这个做了就讲下这个
 * 这个呢 就是 目前比较流行的，环境变量办法，用的php的 $_ENV getenv putenv这三个实现
 */
class Env
{
    public function __construct()
    {
    }

    public function set($name, $value = null)
    {
        if (is_array($name)) {
            $this->setArray($name);
        } else {
            $value = $this->convertEnv($value);

            $_SERVER[$name] = $value;
            $_ENV[$name] = $value;

            if (is_bool($value) && $value === true) {
                $value = 'true';
            }

            if (is_bool($value) && $value === false) {
                $value = 'false';
            }

            if ($value === null) {
                $value = 'null';
            }

            putenv("{$name}={$value}");

        }
    }

    public function get($name)
    {
        if (isset($_ENV[$name])) {
            return $_ENV[$name];
        } elseif (isset($_SERVER[$name])) {
            return $_SERVER[$name];
        }
        return getenv($name);
    }

    private function parse($value) {
        switch ($value) {
            case 'true':
                return true;
            case 'false':
                return false;
            case 'null':
                return null;
        }

        return $value;
    }

    /**
     * @param string $name
     * @return bool|null
     */
    public function del($name)
    {
        if (isset($_SERVER[$name])) {
            unset($_SERVER[$name]);
        }

        if (isset($_ENV[$name])) {
            unset($_ENV[$name]);
        }

        putenv("{$name}=");
    }


    public function setArray(array $array)
    {
        foreach ($array as $key => $value) {
            $this->set($key, $value);
        }
    }

    private function convertEnv($config = '')
    {
        if (strpos($config, '{') !== false) {
            return preg_replace_callback('/\{(.*?)\}/i', function ($match) {
                $tpl = trim($match[1]);
                return $this->get($tpl);
            }, $config);
        }
        return $config;
    }
}